package com.heima.leetcode.practice;

/**
 * 判断一个数是否是回文数
 * @author 勾新杰
 * @version 1.0
 * @date 2024/10/16 17:43
 */
public class E9 {
    /**
     * <h3>方法一，全部反转</h3>
     * @param x 待判断数字
     * @return 是回文数字返回true
     */
    public boolean isPalindrome1(int x) {
        if (x == 0){
            return true;
        }else if (x < 0 || x % 10 == 0){
            return false;
        } else {
            return x == reverse(x);
        }
    }

    /**
     * 反转
     * @param x 待反转
     * @return 反转结果
     */
    private int reverse(int x) {
        int result = 0;
        while (x != 0){
            // 上次结果的权重乘以10再加上这次遍历到的位
            result = result * 10 + x % 10 ;
            x /= 10;
        }
        return result;
    }

    /**
     * <h3>方法一，反转后半部分</h3>
     * @param x 待判断数字
     * @return 是回文数字返回true
     */
    public boolean isPalindrome2(int x) {
        if (x == 0){
            return true;
        }else if (x < 0 || x % 10 == 0){
            return false;
        } else {
            int result = 0;
            // 只反转这个数的后一半，当剩下的小于反转的，说明反转的位数已经比剩下的多了
            // 当x位数为偶数的时候，
            // 假设后半部分反转后大于前半部分退出循环
            // 假设后半部分反转后等于前半部分退出循环
            // 假设后半部分反转后小于前半部分时，那么会再次进入循环，后半部分会多夺取一个元素，前半部分少一个元素，肯定前半部分和后半部分不等且后半大于前半会退出循环成功处理后续逻辑，
            // 但是不能用来反转严格意义上的后半数字
            while (x > result){
                result = result * 10 + x % 10;
                x /= 10;
            }
            return (x == result) || (x == result / 10);
        }
    }
}
